package com.obligatorio.ejb;

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import com.obligatorio.domain.Buzon;
import com.obligatorio.domain.Contactos;
import com.obligatorio.domain.Estados;
import com.obligatorio.domain.Pais;
import com.obligatorio.domain.Sector;
import com.obligatorio.domain.Usuario;
import com.obligatorio.domain.utils.EmailUtils;
import com.obligatorio.persist.dao.BuzonDAOLocal;
import com.obligatorio.persist.dao.UsuarioDAOLocal;

@Stateless
public class ManejadorUsuarioBean implements ManejadorLogin, ManejadorUsuario {
	private static final Logger log = Logger
			.getLogger(ManejadorUsuarioBean.class.getName());

	@EJB
	private NotificationUtils mNotificationUtils;
	@EJB
	private ManejadorPais mPais;
	@EJB
	private ManejadorSector mSector;

	@EJB
	UsuarioDAOLocal usuarioDAO;
	@EJB
	BuzonDAOLocal buzonDAO;

	@EJB
	private ManejadorContactos mContactos;

	@Override
	public Usuario recuperarPass(Usuario user) throws Exception {
		Usuario tmp;
		tmp = usuarioDAO.recuperarPass(user);
		mNotificationUtils.sendJMSMessageToNotificationQueue(user);
		return tmp;
	}

	@Override
	public Integer savePassword(Usuario user) throws Exception {
		return usuarioDAO.savePassword(user);
	}

	@Override
	public Usuario signIn(Usuario login) throws Exception {
		return usuarioDAO.signIn(login);
	}

	@Override
	public Boolean altaUsuario(Usuario user) throws Exception {
		Boolean result = false;
		if (this.validarDatosUsuario(user)) {
			if (!this.existeUsuario(user)) {
				user.setEstado(Estados.ESPERA_ACTIVACION);
				user.setCodeActivate(this.stringValidateAcount());
				if (usuarioDAO.altaUsuario(user)) {
					result = true;
					mNotificationUtils.sendJMSMessageToNotificationQueue(user);
				}
			}
		}
		return result;
	}

	// generacion de numero randomico para activar la cuenta
	// cuando se le envia el mail al usuario
	public String stringValidateAcount() {
		SecureRandom random = new SecureRandom();
		return new BigInteger(130, random).toString(32);
	}

	// Valida que los datos ingresados y su formato sean correctos
	private Boolean validarDatosUsuario(Usuario user) {
		Boolean result = false;
		try {
			if (user != null && !user.getNombre().trim().isEmpty()
					&& !user.getApellido().trim().isEmpty()
					&& !user.getEmail().trim().isEmpty()
					&& !user.getPassword().trim().isEmpty()) {
				if (EmailUtils.isEmail(user.getEmail().trim())
						&& this.largoPassword(user)) {
					result = true;
				}
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	// Valida que el largo de la password sea minimo 6 caracteres
	private Boolean largoPassword(Usuario user) {
		Boolean result = false;
		if (user.getPassword().trim().length() >= 6) {
			result = true;
		} else {
			System.out.println("Largo del Pass incorrecto");
		}
		return result;
	}

	private Boolean existeUsuario(Usuario user) {
		Boolean result = false;
		try {
			if (usuarioDAO.existeUsuario(user)) {
				result = true;
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		return result;
	}

	@Override
	public Usuario modificarUsuario(Usuario user) throws Exception {
		Usuario tmpUsuario = null;
		if (user != null) {

			// TODO Eliminar cuando arreglemos lo del converter.
			Pais p = mPais.ObtenerUnPais(user.getPais().getNombre());
			Sector s = mSector.ObtenerUnSector(user.getSector().getNombre());
			user.setPais(p);
			user.setSector(s);
			tmpUsuario = usuarioDAO.modificarUsuario(user);

			// TODO Cambiar esto para que se ejecute en el Alta del usuario y se
			// encargue de enviar el mail.
			// mNotificationUtils.sendJMSMessageToNotificationQueue(user);
		}
		return tmpUsuario;
	}

	@Override
	public Boolean activarUsuario(String code) throws Exception {
		Boolean result = false;
		try {
			Usuario tmpUsuario = usuarioDAO.activarUsuario(code);
			if (tmpUsuario != null) {
				// Crear Buzon
				Buzon buzon = new Buzon();
				buzon.setIdUsuario(tmpUsuario);
				buzonDAO.crearBuzon(buzon);
				result = true;
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	@Override
	public Usuario obtenerPerfil(Usuario user) throws Exception {
		return usuarioDAO.obtenerPerfil(user);
	}

	@Override
	public List<Usuario> buscarUsuario(String nombre) throws Exception {
		List<Usuario> result = null;
		if (!nombre.trim().isEmpty()) {
			String[] str = nombre.split("\\s");
			log.info("str[0] : " + str[0]);
			log.info("str[1] : " + str[1]);
			result = usuarioDAO.buscarUsuario(str[0], str[1]);
		}
		return result;
	}

	@Override
	public List<Usuario> buscarUsuarios() throws Exception {
		List<Usuario> result = null;
		result = usuarioDAO.buscarUsuarios();
		return result;
	}

	@Override
	public List<Usuario> buscarUsuariosUsuario(String user) throws Exception {
		List<Usuario> result = null;
		result = usuarioDAO.buscarUsuariosUsuario(user);
		return result;
	}

	@Override
	public Usuario buscarContacto(String email) throws Exception {
		Usuario u = null;
		u = usuarioDAO.buscarContacto(email);
		return u;
	}

	@Override
	public List<Usuario> buscarUsuariosUsuario(Usuario user) throws Exception {

		List<Contactos> auxCont = mContactos.ObtenerTodoLosContactos(user);
		List<Usuario> result = new ArrayList<Usuario>();

		for (int i = 0; i < auxCont.size(); i++) {
			Usuario tmpUser = auxCont.get(i).getUsuarioInvitado();
			result.add(tmpUser);
		}
		return result;
	}

}
